package com.huanwang.commonlibrary.base

import android.os.Bundle
import androidx.annotation.NonNull
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProviders
import com.huanwang.commonlibrary.help.stateview.ErrorState
import com.huanwang.commonlibrary.help.stateview.LoadingState
import com.huanwang.commonlibrary.help.stateview.StatusType
import com.huanwang.commonlibrary.utils.ReflectUtils
import com.huanwang.commonlibrary.utils.ToastUtils
import com.huanwang.commonlibrary.utils.activity.AppManager
import com.huanwang.commonlibrary.utils.rxjava.RxBus
import com.tqzhang.stateview.core.LoadManager
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.functions.Consumer

abstract class BaseViewActivityImpl<T : BaseViewModel<*>> : BaseActivity(),BaseViewContract{
    private  var mCompositeDisposable: CompositeDisposable? = null
    protected var mViewModel: T? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        mCompositeDisposable = CompositeDisposable()
        mViewModel = VMProviders(this, ReflectUtils.getInstanceToName<T>(this, 0))
        setSubscription(addRXBusListen()) //Rxjava 发送消息的生命周期监听
        super.onCreate(savedInstanceState)//防止空指针
    }

    override fun onDestroy() {
        super.onDestroy()
        mCompositeDisposable?.clear()
        mViewModel=null
    }

    private  fun <T : ViewModel?> VMProviders(fragment: AppCompatActivity?, @NonNull modelClass: Class<*>?): T? {
        return fragment?.let { ViewModelProviders.of(it).get(modelClass as Class<T>) }
    }



    /**
     * 返回数据类型的监听对象，泛型重复的获取的是同一个对象；需注意
     * @param mutableKey  保存对应bean类的MutableLiveData 对象
     *@return     反回对应bean类的MutableLiveData 对象
     */
    override fun <E> getMutableLiveData(mutableKey : Class<E>): MutableLiveData<E>? {
        return mViewModel?.getMutableLiveData<E>(mutableKey)
    }

    /**
     * Rxjava 消息监听
     * 发送消息请使用：
     * @see RxBus
     */
    open fun addRXBusListen(): Consumer<*>? {
        return null
    }

    private  fun setSubscription(consumer: Consumer<*>?) {
        if (consumer == null) return
        mCompositeDisposable?.add(
            RxBus.getInstance().getDisposable(consumer)
        )
    }

    /**
     * 请求加载失败之后做出的处理
     * @param tag 展示不同错误信息界面
     * @see StatusType
     */
    override fun showErrorLoading(tag : StatusType) {
        loadManager?.showStateView(ErrorState::class.java,tag)
    }

    /**
     * 正在加载中是做出的处理
     * @param tag 展示不同错误信息界面
     * @see StatusType
     */
    override fun showLoading(tag : StatusType) {
        loadManager?.showStateView(LoadingState::class.java)
    }
    /**
     * 关闭加载中和加载失败的界面
     */
    override fun dismissLoading() {
        loadManager?.showSuccess()
    }

    override fun showToast(content: String?) {
        ToastUtils.showToast(content)
    }

    /**
     * 获取管理Activity的对象
     */
    override fun getAppManager(): AppManager? {
        return AppManager.appManager
    }
}